package javaNIO1.buffer;

import com.alibaba.druid.sql.visitor.functions.Char;

import java.nio.CharBuffer;

/**
 * Created with Intel IDEA.
 *  创建缓冲区
 * @Auther: gjt
 * @Date: 2024/7/7 11:03
 */
public class buildBuffer {
    public static void main(String[] args) {

    }

    /**
     * 包装函数和分配函数都是间接的创建缓冲区
     */
    private static void build(){
        /**
         * 创建缓冲区的构造函数
         */
        // 使用静态工厂的分配函数 隐含的从堆中分配一个char 型数组作为备份存储器 他是一个私有的空间
        CharBuffer allocate = CharBuffer.allocate(100);
        // 包装函数 不分配任何空间来存储数据元素， 使用提供的数组作为存储空间来存储缓冲区的数据元素
        CharBuffer.wrap(new char[100]);
        // 包装函数 指定位置的； 这种只占用数组的子集，这个只是缓冲区的初始状态，使用clear()，再填充数据到上界 ，数组中数据会被重写
        CharBuffer.wrap(new char[100], 0 , 15);
        /**
         *  包装函数, 调用put 函数 造成的缓冲区的敢动会影响数组，对数组的任何改动也会影响缓冲区
         */


        // hasArray 会告诉你 这个缓冲区是否有一个可以存取的备份数组
        allocate.hasArray();

        // array() 会返回这个缓冲区对象所使用的数组存储空间的引用，需要结合hasArray(） 返回true 才可以使用；arrayOffset（） 也是一样的  否则抛出 UnsupportedOperationException
        char[] array = allocate.array();
        /**
         *  如果一个缓冲区是只读的 调用array（） 或者 arrayOffset () 抛出 OnlyReadBufferException
         *  arrayOffset() : 返回缓冲区数据在数组中存储的开始位置的偏移量；
         *  note : 如果你用wrap() 的三个参数的 则arrayOffset ()  只会返回 0
         */

        int i = allocate.arrayOffset();
    }
}
